package 简单.模拟;

import java.util.HashSet;
import java.util.Set;

/**
 * 给你一个由若干单词组成的句子 sentence ，单词间由空格分隔。每个单词仅由大写和小写英文字母组成。
 * 请你将句子转换为 “山羊拉丁文（Goat Latin）”（一种类似于 猪拉丁文 - Pig Latin 的虚构语言）。山羊拉丁文的规则如下：
 * <p>
 * 如果单词以元音开头（'a', 'e', 'i', 'o', 'u'），在单词后添加"ma"。
 * 例如，单词 "apple" 变为 "applema" 。
 * 如果单词以辅音字母开头（即，非元音字母），移除第一个字符并将它放到末尾，之后再添加"ma"。
 * 例如，单词 "goat" 变为 "oatgma" 。
 * 根据单词在句子中的索引，在单词最后添加与索引相同数量的字母'a'，索引从 1 开始。
 * 例如，在第一个单词后添加 "a" ，在第二个单词后添加 "aa" ，以此类推。
 * 返回将 sentence 转换为山羊拉丁文后的句子。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/goat-latin
 */
public class 山羊拉丁文_824 {

    public static void main(String[] args) {

        System.out.println(new 山羊拉丁文_824().toGoatLatin("I speak Goat Latin"));

    }

    public static Set<Character> set = new HashSet();

    static {
        set.add('a');
        set.add('o');
        set.add('e');
        set.add('i');
        set.add('u');
        set.add('A');
        set.add('O');
        set.add('E');
        set.add('I');
        set.add('U');
    }

    /**
     * 使用一个哈希表存储元音字符，查询时间复杂度降为O(1)
     * 使用双指针+substring来截取单词
     *
     * @param sentence
     * @return
     */
    public String toGoatLatin(String sentence) {
        StringBuilder stringBuilder = new StringBuilder();
        int left = 0, right = 0, index = 1;
        while (left < sentence.length()) {
            while (right < sentence.length() && sentence.charAt(right) != ' ') right++;

            if (set.contains(sentence.charAt(left))) {
                stringBuilder.append(sentence.substring(left, right));
            } else {
                stringBuilder.append(sentence.substring(left + 1, right))
                        .append(sentence.charAt(left));
            }
            stringBuilder.append("ma");
            for (int i = 0; i < index; i++) {
                stringBuilder.append("a");
            }
            if (right < sentence.length()) stringBuilder.append(" ");
            left = right + 1;
            right = left;
            index++;
        }
        return stringBuilder.toString();
    }

}
